package edu.hunau.cxb.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

import edu.hunau.cxb.entiy.Moo;

/**
 *
 * @author hb
 *
 *         2020-04-28 15:28:51
 */
public class ClassCallTest {

	@Test
	public void test01() throws Exception {
		Class mooClass = Moo.class;
		// 直接通过Moo的无参数构造器实例化Moo
		// 获得无参数构造器
		Constructor cons = mooClass.getDeclaredConstructor();
		// 通过该构造器进行实例化
		Moo obj = (Moo) cons.newInstance();
		System.out.println(obj);

		// 获得私有的构造器,存在一个int类型的参数
		Constructor cons01 = mooClass.getDeclaredConstructor(int.class);
		// 对于私有的资源在使用前必须进行授权
		cons01.setAccessible(true);
		Moo obj02 = (Moo) cons01.newInstance(100);
		System.out.println(obj02);
	}

	@Test
	public void test02() throws Exception {
		Class mooClass = Moo.class;

		// 实例化对象
		Moo moo = (Moo) mooClass.getDeclaredConstructor().newInstance();

		// 获得指定的属性
		Field field = mooClass.getDeclaredField("privateField");
		// 授权
		field.setAccessible(true);
		// 为moo这个实例对象的privateFiled属性赋值为lucy
		field.set(moo, "lucy");
		System.out.println(field.get(moo));
	}

	@Test
	public void test03() throws Exception {
		Class mooClass = Moo.class;
		// 实例化对象
		Moo moo = (Moo) mooClass.getDeclaredConstructor().newInstance();
		
		//获得私有的add方法
		Method addMethod = mooClass.getDeclaredMethod("add", int.class,int.class);
		//授权
		addMethod.setAccessible(true);
		//调用add方法,invoke方法的返回值就是当前方法的结果
		Object result=addMethod.invoke(moo, 100,200);
		System.out.println(result);
	}

}
